package com.hiraeth.modules.monitor.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
@TableName("monitor_alert_rule")
public class MonitorAlertRule implements Serializable {
    private static final long serialVersionUID = -4821978069818760738L;

    /**
     * 告警规则主键
     */
    @TableId(type = IdType.ASSIGN_ID)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    /**
     * 告警规则名称
     */
    private String ruleName;

    /**
     * 仪表盘主键
     */
    private Long dashboardId;

    /**
     * 仪表盘下监控图表主键
     */
    private Long panelId;

    /**
     * 组织主键（当做数据权限列使用）
     */
    private Long orgId;

    /**
     * 规则状态
     * 启用中：ok
     * 待决中：pending
     * 告警中：alerting
     * 已暂停：paused
     */
    private String state;

    /**
     * 告警级别
     */
    private String level;

    /**
     * 告警分类
     */
    private String type;

    /**
     * 执行错误或超时的规则状态
     * 初步定义2个状态
     * 保持上一次状态：keep_state
     * 告警：alerting
     */
    private String executionErrorState;

    /**
     * 查询无数据时规则状态
     */
    private String noDataState;

    /**
     * 统计周期（告警压缩），在period周期内产生告警，规则进入pending状态，不进行告警，超过period周期依旧告警，则触发告警通知
     */
    private String period;

    /**
     * 检查频率（每frequency时间计算一次规则）
     */
    private String frequency;

    /**
     * 规则状态变更时间
     */
    private Date newStateDate;

    /**
     * 规则状态总变更次数
     */
    private int stateChanges;

    /**
     * 规则创建时间
     */
    private Date created;

    /**
     * 规则更新时间
     */
    private Date updated;

    /**
     * 告警消息or告警消息模板（模板时，须讨论制定模板变量）
     */
    private String message;

    /**
     * 告警规则具体配置json串
     */
    private String expression;

    /**
     * 告警渠道数组，数组内为对象，对象内key为id，value为告警渠道主键
     */
    private String notifications;

    /**
     * 阈值下限
     */
    private Double minThreshold;
    /**
     * 阈值上限
     */
    private Double maxThreshold;

    /**
     * 监控值与阈值比较符
     * 大于：gt
     * 大于等于：gte
     * 小于：lt
     * 小于等于：lte
     */
    private String operator;

    /**
     * target ip地址
     */
    private String targetIp;

    /**
     * 本次规则计算得到的监控值
     */
    @TableField(exist = false)
    private Double monitorValue;
}
